/*
 * @Author: 0x9DEFA478
 * @Date: 2021-11-24 21:17:52
 * @LastEditTime: 2021-12-10 17:58:53
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#include "IP_DMA2D.h"
#include "H_ThreadScheduler.h"


extern const unsigned int IP_DMA2D_CLUT_Gary_Table[];


/**
 * @brief 填充颜色 RGB565
 * @param ip_dma2d IP_DMA2D句柄
 * @param Bitmap 要操作的位图和区域坐标
 * @param Area 区域尺寸
 * @param Color 填充的颜色 RGB565
 * @return 0:成功 其他:启动失败
 */
int IP_DMA2D_FillColor_RGB565(IP_DMA2D* ip_dma2d,IP_DMA2D_Bitmap_Param* Bitmap,IP_DMA2D_Area* Area,unsigned short Color){

  if(ip_dma2d->IsBusy!=0){
    return 0xFFFFFFFFU;
  }
  ip_dma2d->IsBusy=-1;

  H_TS_BinarySemaphoreTryTake(ip_dma2d->Sem_OperationDone);

  cIP_DMA2D_DMA2D(ip_dma2d)->CR=(0x3U<<DMA2D_CR_MODE_Pos)|(DMA2D_CR_CEIE|DMA2D_CR_TCIE|DMA2D_CR_TEIE);

  cIP_DMA2D_DMA2D(ip_dma2d)->OPFCCR=0x2U<<DMA2D_OPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->OCOLR=(unsigned int)Color;
  cIP_DMA2D_DMA2D(ip_dma2d)->OMAR=cIP_DMA2D_Bitmap_Param_GetMAR(Bitmap,2U);
  cIP_DMA2D_DMA2D(ip_dma2d)->OOR=cIP_DMA2D_Bitmap_Param_GetOR(Bitmap,Area);
  
  cIP_DMA2D_DMA2D(ip_dma2d)->NLR=((unsigned int)Area->Width<<DMA2D_NLR_PL_Pos)|((unsigned int)Area->Height<<DMA2D_NLR_NL_Pos);

  cIP_DMA2D_DMA2D(ip_dma2d)->CR|=DMA2D_CR_START;

  return 0;
}

/**
 * @brief 填充颜色 ARGB8888
 * @param ip_dma2d IP_DMA2D句柄
 * @param Bitmap 要操作的位图和区域坐标
 * @param Area 区域尺寸
 * @param Color 填充的颜色 ARGB8888
 * @return 0:成功 其他:启动失败
 */
int IP_DMA2D_FillColor_ARGB8888(IP_DMA2D* ip_dma2d,IP_DMA2D_Bitmap_Param* Bitmap,IP_DMA2D_Area* Area,unsigned int Color){

  if(ip_dma2d->IsBusy!=0){
    return -1;
  }
  ip_dma2d->IsBusy=-1;

  H_TS_BinarySemaphoreTryTake(ip_dma2d->Sem_OperationDone);

  cIP_DMA2D_DMA2D(ip_dma2d)->CR=(0x3U<<DMA2D_CR_MODE_Pos)|(DMA2D_CR_CEIE|DMA2D_CR_TCIE|DMA2D_CR_TEIE);

  cIP_DMA2D_DMA2D(ip_dma2d)->OPFCCR=0x0U<<DMA2D_OPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->OCOLR=Color;
  cIP_DMA2D_DMA2D(ip_dma2d)->OMAR=cIP_DMA2D_Bitmap_Param_GetMAR(Bitmap,4U);
  cIP_DMA2D_DMA2D(ip_dma2d)->OOR=cIP_DMA2D_Bitmap_Param_GetOR(Bitmap,Area);
  
  cIP_DMA2D_DMA2D(ip_dma2d)->NLR=((unsigned int)Area->Width<<DMA2D_NLR_PL_Pos)|((unsigned int)Area->Height<<DMA2D_NLR_NL_Pos);

  cIP_DMA2D_DMA2D(ip_dma2d)->CR|=DMA2D_CR_START;

  return 0;
}


/**
 * @brief 位图复制 RGB565
 * @param ip_dma2d IP_DMA2D句柄
 * @param SrcBitmap 源位图和区域坐标
 * @param DstBitmap 目标位图和区域坐标
 * @param Area 区域尺寸
 * @return 0:成功 其他:启动失败
 */
int IP_DMA2D_Copy_RGB565(IP_DMA2D* ip_dma2d,IP_DMA2D_Bitmap_Param* SrcBitmap,IP_DMA2D_Bitmap_Param* DstBitmap,IP_DMA2D_Area* Area){

  if(ip_dma2d->IsBusy!=0){
    return -1;
  }
  ip_dma2d->IsBusy=-1;

  H_TS_BinarySemaphoreTryTake(ip_dma2d->Sem_OperationDone);

  cIP_DMA2D_DMA2D(ip_dma2d)->CR=(0x0U<<DMA2D_CR_MODE_Pos)|(DMA2D_CR_CEIE|DMA2D_CR_TCIE|DMA2D_CR_TEIE);

  cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR=0x2U<<DMA2D_FGPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->FGMAR=cIP_DMA2D_Bitmap_Param_GetMAR(SrcBitmap,2U);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGOR=cIP_DMA2D_Bitmap_Param_GetOR(SrcBitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->OPFCCR=0x2U<<DMA2D_OPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->OMAR=cIP_DMA2D_Bitmap_Param_GetMAR(DstBitmap,2U);
  cIP_DMA2D_DMA2D(ip_dma2d)->OOR=cIP_DMA2D_Bitmap_Param_GetOR(DstBitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->NLR=((unsigned int)Area->Width<<DMA2D_NLR_PL_Pos)|(unsigned int)Area->Height<<DMA2D_NLR_NL_Pos;

  cIP_DMA2D_DMA2D(ip_dma2d)->CR|=DMA2D_CR_START;

  return 0;
}

/**
 * @brief 位图复制 ARGB8888
 * @param ip_dma2d IP_DMA2D句柄
 * @param SrcBitmap 源位图和区域坐标
 * @param DstBitmap 目标位图和区域坐标
 * @param Area 区域尺寸
 * @return 0:成功 其他:启动失败
 */
int IP_DMA2D_Copy_ARGB8888(IP_DMA2D* ip_dma2d,IP_DMA2D_Bitmap_Param* SrcBitmap,IP_DMA2D_Bitmap_Param* DstBitmap,IP_DMA2D_Area* Area){

  if(ip_dma2d->IsBusy!=0){
    return -1;
  }
  ip_dma2d->IsBusy=-1;

  H_TS_BinarySemaphoreTryTake(ip_dma2d->Sem_OperationDone);

  cIP_DMA2D_DMA2D(ip_dma2d)->CR=(0x0U<<DMA2D_CR_MODE_Pos)|(DMA2D_CR_CEIE|DMA2D_CR_TCIE|DMA2D_CR_TEIE);

  cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR=0x0U<<DMA2D_FGPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->FGMAR=cIP_DMA2D_Bitmap_Param_GetMAR(SrcBitmap,4U);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGOR=cIP_DMA2D_Bitmap_Param_GetOR(SrcBitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->OPFCCR=0x0U<<DMA2D_OPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->OMAR=cIP_DMA2D_Bitmap_Param_GetMAR(DstBitmap,4U);
  cIP_DMA2D_DMA2D(ip_dma2d)->OOR=cIP_DMA2D_Bitmap_Param_GetOR(DstBitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->NLR=((unsigned int)Area->Width<<DMA2D_NLR_PL_Pos)|(unsigned int)Area->Height<<DMA2D_NLR_NL_Pos;

  cIP_DMA2D_DMA2D(ip_dma2d)->CR|=DMA2D_CR_START;

  return 0;
}


/**
 * @brief 图像添加掩膜 RGB565
 * @param ip_dma2d IP_DMA2D句柄
 * @param Bitmap 要操作的位图和区域坐标
 * @param Mask 掩膜位图和区域坐标 8Bit透明度
 * @param Area 区域尺寸
 * @param Color 掩膜颜色 ARGB8888
 * @return 0:成功 其他:启动失败
 */
int IP_DMA2D_FillMaskToRGB565(IP_DMA2D* ip_dma2d,IP_DMA2D_Bitmap_Param* Bitmap,IP_DMA2D_Bitmap_Param* Mask,IP_DMA2D_Area* Area,unsigned int Color){

  unsigned int MAR;
  unsigned int OR;

  if(ip_dma2d->IsBusy!=0){
    return -1;
  }
  ip_dma2d->IsBusy=-1;

  H_TS_BinarySemaphoreTryTake(ip_dma2d->Sem_OperationDone);

  MAR=cIP_DMA2D_Bitmap_Param_GetMAR(Bitmap,2U);
  OR=cIP_DMA2D_Bitmap_Param_GetOR(Bitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->CR=(0x2U<<DMA2D_CR_MODE_Pos)|(DMA2D_CR_CEIE|DMA2D_CR_TCIE|DMA2D_CR_TEIE);

  cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR=(0x9U<<DMA2D_FGPFCCR_CM_Pos)|(0x2U<<DMA2D_FGPFCCR_AM_Pos)|(Color&DMA2D_FGPFCCR_ALPHA_Msk);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGCOLR=Color&(DMA2D_FGCOLR_RED_Msk|DMA2D_FGCOLR_GREEN_Msk|DMA2D_FGCOLR_BLUE_Msk);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGMAR=cIP_DMA2D_Bitmap_Param_GetMAR(Mask,1U);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGOR=cIP_DMA2D_Bitmap_Param_GetOR(Mask,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->BGPFCCR=0x2U<<DMA2D_BGPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->BGMAR=MAR;
  cIP_DMA2D_DMA2D(ip_dma2d)->BGOR=OR;

  cIP_DMA2D_DMA2D(ip_dma2d)->OPFCCR=0x2U<<DMA2D_OPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->OCOLR=0U;
  cIP_DMA2D_DMA2D(ip_dma2d)->OMAR=MAR;
  cIP_DMA2D_DMA2D(ip_dma2d)->OOR=OR;

  cIP_DMA2D_DMA2D(ip_dma2d)->NLR=((unsigned int)Area->Width<<DMA2D_NLR_PL_Pos)|(unsigned int)Area->Height<<DMA2D_NLR_NL_Pos;

  cIP_DMA2D_DMA2D(ip_dma2d)->CR|=DMA2D_CR_START;

  return 0;
}

/**
 * @brief 图像添加掩膜 ARGB8888
 * @param ip_dma2d IP_DMA2D句柄
 * @param Bitmap 要操作的位图和区域坐标
 * @param Mask 掩膜位图和区域坐标 8Bit透明度
 * @param Area 区域尺寸
 * @param Color 掩膜颜色 ARGB8888
 * @return 0:成功 其他:启动失败
 */
int IP_DMA2D_FillMaskToARGB8888(IP_DMA2D* ip_dma2d,IP_DMA2D_Bitmap_Param* Bitmap,IP_DMA2D_Bitmap_Param* Mask,IP_DMA2D_Area* Area,unsigned int Color){

  unsigned int MAR;
  unsigned int OR;

  if(ip_dma2d->IsBusy!=0){
    return -1;
  }
  ip_dma2d->IsBusy=-1;

  H_TS_BinarySemaphoreTryTake(ip_dma2d->Sem_OperationDone);

  MAR=cIP_DMA2D_Bitmap_Param_GetMAR(Bitmap,4U);
  OR=cIP_DMA2D_Bitmap_Param_GetOR(Bitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->CR=(0x2U<<DMA2D_CR_MODE_Pos)|(DMA2D_CR_CEIE|DMA2D_CR_TCIE|DMA2D_CR_TEIE);

  cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR=(0x9U<<DMA2D_FGPFCCR_CM_Pos)|(0x2U<<DMA2D_FGPFCCR_AM_Pos)|(Color&DMA2D_FGPFCCR_ALPHA_Msk);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGCOLR=Color&(DMA2D_FGCOLR_RED_Msk|DMA2D_FGCOLR_GREEN_Msk|DMA2D_FGCOLR_BLUE_Msk);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGMAR=cIP_DMA2D_Bitmap_Param_GetMAR(Mask,1U);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGOR=cIP_DMA2D_Bitmap_Param_GetOR(Mask,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->BGPFCCR=0x0U<<DMA2D_BGPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->BGMAR=MAR;
  cIP_DMA2D_DMA2D(ip_dma2d)->BGOR=OR;

  cIP_DMA2D_DMA2D(ip_dma2d)->OPFCCR=0x0U<<DMA2D_OPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->OCOLR=0U;
  cIP_DMA2D_DMA2D(ip_dma2d)->OMAR=MAR;
  cIP_DMA2D_DMA2D(ip_dma2d)->OOR=OR;

  cIP_DMA2D_DMA2D(ip_dma2d)->NLR=((unsigned int)Area->Width<<DMA2D_NLR_PL_Pos)|(unsigned int)Area->Height<<DMA2D_NLR_NL_Pos;

  cIP_DMA2D_DMA2D(ip_dma2d)->CR|=DMA2D_CR_START;

  return 0;
}


/**
 * @brief 图像混合 RGB565
 * @param ip_dma2d IP_DMA2D句柄
 * @param FGBitmap 前景位图和区域坐标
 * @param BGBitmap 背景位图和区域坐标
 * @param OBitmap 输出到的位图和区域坐标
 * @param Area 区域尺寸
 * @param FGOpacity 前景不透明度
 * @param BGOpacity 背景景不透明度
 * @return 0:成功 其他:启动失败
 */
int IP_DMA2D_Blend_RGB565(IP_DMA2D* ip_dma2d,IP_DMA2D_Bitmap_Param* FGBitmap,IP_DMA2D_Bitmap_Param* BGBitmap,IP_DMA2D_Bitmap_Param* OBitmap
  ,IP_DMA2D_Area* Area,unsigned char FGOpacity,unsigned char BGOpacity){

  if(ip_dma2d->IsBusy!=0){
    return -1;
  }
  ip_dma2d->IsBusy=-1;

  H_TS_BinarySemaphoreTryTake(ip_dma2d->Sem_OperationDone);

  cIP_DMA2D_DMA2D(ip_dma2d)->CR=(0x2U<<DMA2D_CR_MODE_Pos)|(DMA2D_CR_CEIE|DMA2D_CR_TCIE|DMA2D_CR_TEIE);

  cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR=(0x2U<<DMA2D_FGPFCCR_CM_Pos)|(0x2U<<DMA2D_FGPFCCR_AM_Pos)|((FGOpacity<<DMA2D_FGPFCCR_ALPHA_Pos)&DMA2D_FGPFCCR_ALPHA_Msk);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGMAR=cIP_DMA2D_Bitmap_Param_GetMAR(FGBitmap,2U);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGOR=cIP_DMA2D_Bitmap_Param_GetOR(FGBitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->BGPFCCR=(0x2U<<DMA2D_BGPFCCR_CM_Pos)|(0x2U<<DMA2D_BGPFCCR_AM_Pos)|((BGOpacity<<DMA2D_BGPFCCR_ALPHA_Pos)&DMA2D_BGPFCCR_ALPHA_Msk);
  cIP_DMA2D_DMA2D(ip_dma2d)->BGMAR=cIP_DMA2D_Bitmap_Param_GetMAR(BGBitmap,2U);
  cIP_DMA2D_DMA2D(ip_dma2d)->BGOR=cIP_DMA2D_Bitmap_Param_GetOR(BGBitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->OPFCCR=0x2U<<DMA2D_OPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->OCOLR=0U;
  cIP_DMA2D_DMA2D(ip_dma2d)->OMAR=cIP_DMA2D_Bitmap_Param_GetMAR(OBitmap,2U);
  cIP_DMA2D_DMA2D(ip_dma2d)->OOR=cIP_DMA2D_Bitmap_Param_GetOR(OBitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->NLR=((unsigned int)Area->Width<<DMA2D_NLR_PL_Pos)|(unsigned int)Area->Height<<DMA2D_NLR_NL_Pos;

  cIP_DMA2D_DMA2D(ip_dma2d)->CR|=DMA2D_CR_START;

  return 0;
}

/**
 * @brief 图像混合 ARGB8888
 * @param ip_dma2d IP_DMA2D句柄
 * @param FGBitmap 前景位图和区域坐标
 * @param BGBitmap 背景位图和区域坐标
 * @param OBitmap 输出到的位图和区域坐标
 * @param Area 区域尺寸
 * @param FGOpacity 前景不透明度
 * @param BGOpacity 背景景不透明度
 * @return 0:成功 其他:启动失败
 */
int IP_DMA2D_Blend_ARGB8888(IP_DMA2D* ip_dma2d,IP_DMA2D_Bitmap_Param* FGBitmap,IP_DMA2D_Bitmap_Param* BGBitmap,IP_DMA2D_Bitmap_Param* OBitmap
  ,IP_DMA2D_Area* Area,unsigned char FGOpacity,unsigned char BGOpacity){

  if(ip_dma2d->IsBusy!=0){
    return -1;
  }
  ip_dma2d->IsBusy=-1;

  H_TS_BinarySemaphoreTryTake(ip_dma2d->Sem_OperationDone);

  cIP_DMA2D_DMA2D(ip_dma2d)->CR=(0x2U<<DMA2D_CR_MODE_Pos)|(DMA2D_CR_CEIE|DMA2D_CR_TCIE|DMA2D_CR_TEIE);

  cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR=(0x0U<<DMA2D_FGPFCCR_CM_Pos)|(0x2U<<DMA2D_FGPFCCR_AM_Pos)|((FGOpacity<<DMA2D_FGPFCCR_ALPHA_Pos)&DMA2D_FGPFCCR_ALPHA_Msk);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGMAR=cIP_DMA2D_Bitmap_Param_GetMAR(FGBitmap,4U);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGOR=cIP_DMA2D_Bitmap_Param_GetOR(FGBitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->BGPFCCR=(0x0U<<DMA2D_BGPFCCR_CM_Pos)|(0x2U<<DMA2D_BGPFCCR_AM_Pos)|((BGOpacity<<DMA2D_BGPFCCR_ALPHA_Pos)&DMA2D_BGPFCCR_ALPHA_Msk);
  cIP_DMA2D_DMA2D(ip_dma2d)->BGMAR=cIP_DMA2D_Bitmap_Param_GetMAR(BGBitmap,4U);
  cIP_DMA2D_DMA2D(ip_dma2d)->BGOR=cIP_DMA2D_Bitmap_Param_GetOR(BGBitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->OPFCCR=0x0U<<DMA2D_OPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->OCOLR=0U;
  cIP_DMA2D_DMA2D(ip_dma2d)->OMAR=cIP_DMA2D_Bitmap_Param_GetMAR(OBitmap,4U);
  cIP_DMA2D_DMA2D(ip_dma2d)->OOR=cIP_DMA2D_Bitmap_Param_GetOR(OBitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->NLR=((unsigned int)Area->Width<<DMA2D_NLR_PL_Pos)|(unsigned int)Area->Height<<DMA2D_NLR_NL_Pos;

  cIP_DMA2D_DMA2D(ip_dma2d)->CR|=DMA2D_CR_START;

  return 0;
}


/**
 * @brief YCbCr转RGB565
 * @param ip_dma2d IP_DMA2D句柄
 * @param SrcBuffer 源缓存和区域坐标 坐标需为8的倍数
 * @param YCbCrType 源类型 vIP_DMA2D_YCbCr444 vIP_DMA2D_YCbCr422 vIP_DMA2D_YCbCr420
 * @param DstBitmap 目标位图和区域坐标
 * @param Area 区域尺寸
 * @return 0:成功 其他:启动失败
 */
int IP_DMA2D_YCbCrToRGB565(IP_DMA2D* ip_dma2d,IP_DMA2D_Bitmap_Param* SrcBuffer,int YCbCrType,IP_DMA2D_Bitmap_Param* DstBitmap,IP_DMA2D_Area* Area){
  int SrcWidth;
  unsigned int Src;
  unsigned int CSS;

  if(ip_dma2d->IsBusy!=0){
    return -1;
  }
  ip_dma2d->IsBusy=-1;

  H_TS_BinarySemaphoreTryTake(ip_dma2d->Sem_OperationDone);

  
  SrcWidth=SrcBuffer->Bitmap.Width;
  Src=(unsigned int)SrcBuffer->Bitmap.Bitmap;
  switch(YCbCrType){
    case vIP_DMA2D_YCbCr444:
      CSS=0x0U;
      SrcWidth=(SrcWidth+7)&(~0x7U);
      Src=((unsigned int)Src)+((SrcBuffer->Local.X>>3)+(SrcBuffer->Local.Y>>3)*(SrcBuffer->Bitmap.Width>>3))*(64+64+64);
      break;
    case vIP_DMA2D_YCbCr422:
      CSS=0x1U;
      SrcWidth=(SrcWidth+15)&(~0xFU);
      Src=((unsigned int)Src)+((SrcBuffer->Local.X>>4)+(SrcBuffer->Local.Y>>3)*(SrcBuffer->Bitmap.Width>>4))*(128+64+64);
      break;
    case vIP_DMA2D_YCbCr420:
      CSS=0x2U;
      SrcWidth=(SrcWidth+15)&(~0xFU);
      Src=((unsigned int)Src)+((SrcBuffer->Local.X>>4)+(SrcBuffer->Local.Y>>4)*(SrcBuffer->Bitmap.Width>>4))*(256+64+64);
      break;
    default:
      ip_dma2d->IsBusy=0;
      return -2;
  }

  cIP_DMA2D_DMA2D(ip_dma2d)->CR=(0x1U<<DMA2D_CR_MODE_Pos)|(DMA2D_CR_CEIE|DMA2D_CR_TCIE|DMA2D_CR_TEIE);

  cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR=(0xBU<<DMA2D_FGPFCCR_CM_Pos)|(CSS<<DMA2D_FGPFCCR_CSS_Pos);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGMAR=Src;
  cIP_DMA2D_DMA2D(ip_dma2d)->FGOR=(unsigned int)(SrcWidth-Area->Width);

  cIP_DMA2D_DMA2D(ip_dma2d)->OPFCCR=0x2U<<DMA2D_OPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->OCOLR=0U;
  cIP_DMA2D_DMA2D(ip_dma2d)->OMAR=cIP_DMA2D_Bitmap_Param_GetMAR(DstBitmap,2U);
  cIP_DMA2D_DMA2D(ip_dma2d)->OOR=cIP_DMA2D_Bitmap_Param_GetOR(DstBitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->NLR=((unsigned int)Area->Width<<DMA2D_NLR_PL_Pos)|(unsigned int)Area->Height<<DMA2D_NLR_NL_Pos;

  DMA2D->CR|=DMA2D_CR_START;//开始传输

  return 0;
}

/**
 * @brief YCbCr转ARGB8888
 * @param ip_dma2d IP_DMA2D句柄
 * @param SrcBuffer 源缓存和区域坐标 坐标需为8的倍数
 * @param YCbCrType 源类型 vIP_DMA2D_YCbCr444 vIP_DMA2D_YCbCr422 vIP_DMA2D_YCbCr420
 * @param DstBitmap 目标位图和区域坐标
 * @param Area 区域尺寸
 * @return 0:成功 其他:启动失败
 */
int IP_DMA2D_YCbCrToARGB8888(IP_DMA2D* ip_dma2d,IP_DMA2D_Bitmap_Param* SrcBuffer,int YCbCrType,IP_DMA2D_Bitmap_Param* DstBitmap,IP_DMA2D_Area* Area){
  int SrcWidth;
  unsigned int Src;
  unsigned int CSS;

  if(ip_dma2d->IsBusy!=0){
    return -1;
  }
  ip_dma2d->IsBusy=-1;

  H_TS_BinarySemaphoreTryTake(ip_dma2d->Sem_OperationDone);

  
  SrcWidth=SrcBuffer->Bitmap.Width;
  Src=(unsigned int)SrcBuffer->Bitmap.Bitmap;
  switch(YCbCrType){
    case vIP_DMA2D_YCbCr444:
      CSS=0x0U;
      SrcWidth=(SrcWidth+7)&(~0x7U);
      Src=((unsigned int)Src)+((SrcBuffer->Local.X>>3)+(SrcBuffer->Local.Y>>3)*(SrcBuffer->Bitmap.Width>>3))*(64+64+64);
      break;
    case vIP_DMA2D_YCbCr422:
      CSS=0x1U;
      SrcWidth=(SrcWidth+15)&(~0xFU);
      Src=((unsigned int)Src)+((SrcBuffer->Local.X>>4)+(SrcBuffer->Local.Y>>3)*(SrcBuffer->Bitmap.Width>>4))*(128+64+64);
      break;
    case vIP_DMA2D_YCbCr420:
      CSS=0x2U;
      SrcWidth=(SrcWidth+15)&(~0xFU);
      Src=((unsigned int)Src)+((SrcBuffer->Local.X>>4)+(SrcBuffer->Local.Y>>4)*(SrcBuffer->Bitmap.Width>>4))*(256+64+64);
      break;
    default:
      ip_dma2d->IsBusy=0;
      return -2;
  }

  cIP_DMA2D_DMA2D(ip_dma2d)->CR=(0x1U<<DMA2D_CR_MODE_Pos)|(DMA2D_CR_CEIE|DMA2D_CR_TCIE|DMA2D_CR_TEIE);

  cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR=(0xBU<<DMA2D_FGPFCCR_CM_Pos)|(CSS<<DMA2D_FGPFCCR_CSS_Pos);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGMAR=Src;
  cIP_DMA2D_DMA2D(ip_dma2d)->FGOR=(unsigned int)(SrcWidth-Area->Width);

  cIP_DMA2D_DMA2D(ip_dma2d)->OPFCCR=0x0U<<DMA2D_OPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->OCOLR=0U;
  cIP_DMA2D_DMA2D(ip_dma2d)->OMAR=cIP_DMA2D_Bitmap_Param_GetMAR(DstBitmap,4U);
  cIP_DMA2D_DMA2D(ip_dma2d)->OOR=cIP_DMA2D_Bitmap_Param_GetOR(DstBitmap,Area);

  cIP_DMA2D_DMA2D(ip_dma2d)->NLR=((unsigned int)Area->Width<<DMA2D_NLR_PL_Pos)|(unsigned int)Area->Height<<DMA2D_NLR_NL_Pos;

  DMA2D->CR|=DMA2D_CR_START;//开始传输

  return 0;
}


/**
 * @brief 灰度转RGB565
 * @param ip_dma2d IP_DMA2D句柄
 * @param SrcBuffer 源缓存和区域坐标
 * @param DstBitmap 目标位图和区域坐标
 * @param Area 区域尺寸
 * @return 0:成功 其他:启动失败
 */
int IP_DMA2D_GrayToRGB565(IP_DMA2D* ip_dma2d,IP_DMA2D_Bitmap_Param* SrcBuffer,IP_DMA2D_Bitmap_Param* DstBitmap,IP_DMA2D_Area* Area){
  
  if(ip_dma2d->IsBusy!=0){
    return -1;
  }
  ip_dma2d->IsBusy=-1;

  H_TS_BinarySemaphoreTryTake(ip_dma2d->Sem_OperationDone);

  cIP_DMA2D_DMA2D(ip_dma2d)->CR=(0x1U<<DMA2D_CR_MODE_Pos);

  cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR=(0x5U<<DMA2D_FGPFCCR_CM_Pos)|(0xFFU<<DMA2D_FGPFCCR_CS_Pos);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGMAR=cIP_DMA2D_Bitmap_Param_GetMAR(SrcBuffer,1U);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGOR=cIP_DMA2D_Bitmap_Param_GetOR(SrcBuffer,Area);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGCMAR=(unsigned int)IP_DMA2D_CLUT_Gary_Table;

  cIP_DMA2D_DMA2D(ip_dma2d)->OPFCCR=0x2U<<DMA2D_OPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->OCOLR=0U;
  cIP_DMA2D_DMA2D(ip_dma2d)->OMAR=cIP_DMA2D_Bitmap_Param_GetMAR(DstBitmap,2U);
  cIP_DMA2D_DMA2D(ip_dma2d)->OOR=cIP_DMA2D_Bitmap_Param_GetOR(DstBitmap,Area);
  
  cIP_DMA2D_DMA2D(ip_dma2d)->NLR=((unsigned int)Area->Width<<DMA2D_NLR_PL_Pos)|(unsigned int)Area->Height<<DMA2D_NLR_NL_Pos;

  cIP_DMA2D_DMA2D(ip_dma2d)->IFCR=DMA2D_IFCR_CCEIF|DMA2D_IFCR_CCTCIF|DMA2D_IFCR_CAECIF|DMA2D_IFCR_CTCIF|DMA2D_IFCR_CTEIF;
  cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR|=DMA2D_FGPFCCR_START;
  while((cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR&DMA2D_FGPFCCR_START)!=0){
  }
  if((cIP_DMA2D_DMA2D(ip_dma2d)->ISR&DMA2D_ISR_CTCIF)==0){
    cIP_DMA2D_DMA2D(ip_dma2d)->IFCR=DMA2D_IFCR_CCEIF|DMA2D_IFCR_CAECIF|DMA2D_IFCR_CTCIF|DMA2D_IFCR_CTEIF;
    ip_dma2d->IsBusy=0;
    return -2;
  }

  cIP_DMA2D_DMA2D(ip_dma2d)->CR|=(DMA2D_CR_CEIE|DMA2D_CR_TCIE|DMA2D_CR_TEIE);
  DMA2D->CR|=DMA2D_CR_START;//开始传输

  return 0;
}

/**
 * @brief 灰度转ARGB8888
 * @param ip_dma2d IP_DMA2D句柄
 * @param SrcBuffer 源缓存和区域坐标
 * @param DstBitmap 目标位图和区域坐标
 * @param Area 区域尺寸
 * @return 0:成功 其他:启动失败
 */
int IP_DMA2D_GrayToARGB8888(IP_DMA2D* ip_dma2d,IP_DMA2D_Bitmap_Param* SrcBuffer,IP_DMA2D_Bitmap_Param* DstBitmap,IP_DMA2D_Area* Area){
  
  if(ip_dma2d->IsBusy!=0){
    return -1;
  }
  ip_dma2d->IsBusy=-1;

  H_TS_BinarySemaphoreTryTake(ip_dma2d->Sem_OperationDone);

  cIP_DMA2D_DMA2D(ip_dma2d)->CR=(0x1U<<DMA2D_CR_MODE_Pos);

  cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR=(0x5U<<DMA2D_FGPFCCR_CM_Pos)|(0xFFU<<DMA2D_FGPFCCR_CS_Pos);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGMAR=cIP_DMA2D_Bitmap_Param_GetMAR(SrcBuffer,1U);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGOR=cIP_DMA2D_Bitmap_Param_GetOR(SrcBuffer,Area);
  cIP_DMA2D_DMA2D(ip_dma2d)->FGCMAR=(unsigned int)IP_DMA2D_CLUT_Gary_Table;

  cIP_DMA2D_DMA2D(ip_dma2d)->OPFCCR=0x0U<<DMA2D_OPFCCR_CM_Pos;
  cIP_DMA2D_DMA2D(ip_dma2d)->OCOLR=0U;
  cIP_DMA2D_DMA2D(ip_dma2d)->OMAR=cIP_DMA2D_Bitmap_Param_GetMAR(DstBitmap,4U);
  cIP_DMA2D_DMA2D(ip_dma2d)->OOR=cIP_DMA2D_Bitmap_Param_GetOR(DstBitmap,Area);
  
  cIP_DMA2D_DMA2D(ip_dma2d)->NLR=((unsigned int)Area->Width<<DMA2D_NLR_PL_Pos)|(unsigned int)Area->Height<<DMA2D_NLR_NL_Pos;

  cIP_DMA2D_DMA2D(ip_dma2d)->IFCR=DMA2D_IFCR_CCEIF|DMA2D_IFCR_CCTCIF|DMA2D_IFCR_CAECIF|DMA2D_IFCR_CTCIF|DMA2D_IFCR_CTEIF;
  cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR|=DMA2D_FGPFCCR_START;
  while((cIP_DMA2D_DMA2D(ip_dma2d)->FGPFCCR&DMA2D_FGPFCCR_START)!=0){
  }
  if((cIP_DMA2D_DMA2D(ip_dma2d)->ISR&DMA2D_ISR_CTCIF)==0){
    cIP_DMA2D_DMA2D(ip_dma2d)->IFCR=DMA2D_IFCR_CCEIF|DMA2D_IFCR_CAECIF|DMA2D_IFCR_CTCIF|DMA2D_IFCR_CTEIF;
    ip_dma2d->IsBusy=0;
    return -2;
  }
  cIP_DMA2D_DMA2D(ip_dma2d)->IFCR=DMA2D_IFCR_CCEIF|DMA2D_IFCR_CCTCIF|DMA2D_IFCR_CAECIF|DMA2D_IFCR_CTCIF|DMA2D_IFCR_CTEIF;

  cIP_DMA2D_DMA2D(ip_dma2d)->CR|=(DMA2D_CR_CEIE|DMA2D_CR_TCIE|DMA2D_CR_TEIE);
  DMA2D->CR|=DMA2D_CR_START;//开始传输

  return 0;
}




/**
 * @brief 阻塞线程 等待DMA2D操作完毕
 * @param ip_dma2d IP_DMA2D句柄
 * @return vIP_DMA2D_Error_None:无异常 其他:异常代号
 */
unsigned int IP_DMA2D_WaitBusy(IP_DMA2D* ip_dma2d){

  if(ip_dma2d->IsBusy==0){
    return ip_dma2d->Result;
  }

  H_TS_BinarySemaphoreTake(ip_dma2d->Sem_OperationDone);
  ip_dma2d->IsBusy=0;
  return ip_dma2d->Result;
}








/**
 * @brief DMA2D中断调用
 * @param ip_dma2d IP_DMA2D句柄
 * @return 无
 */
void IP_DMA2D_IRQ(IP_DMA2D* ip_dma2d){

  unsigned int ISR;
  unsigned int Result;

  ISR=cIP_DMA2D_DMA2D(ip_dma2d)->ISR;

  Result=vIP_DMA2D_Error_None;
  if((ISR&DMA2D_ISR_CEIF)!=0){
    cIP_DMA2D_DMA2D(ip_dma2d)->IFCR=DMA2D_IFCR_CCEIF;
    Result|=vIP_DMA2D_Error_CEIF;
  }
  if((ISR&DMA2D_ISR_CAEIF)!=0){
    cIP_DMA2D_DMA2D(ip_dma2d)->IFCR=DMA2D_IFCR_CAECIF;
    Result|=vIP_DMA2D_Error_CAEIF;
  }
  if((ISR&DMA2D_ISR_TEIF)!=0){
    cIP_DMA2D_DMA2D(ip_dma2d)->IFCR=DMA2D_IFCR_CTEIF;
    Result|=vIP_DMA2D_Error_TEIF;
  }
  ip_dma2d->Result=Result;
  if(Result!=vIP_DMA2D_Error_None){
    H_TS_BinarySemaphoreGive_ISR(ip_dma2d->Sem_OperationDone);
  }
  if((ISR&DMA2D_ISR_CTCIF)!=0){
    cIP_DMA2D_DMA2D(ip_dma2d)->IFCR=DMA2D_IFCR_CCTCIF;

    H_TS_BinarySemaphoreGive_ISR(ip_dma2d->Sem_OperationDone);
  }
  if((ISR&DMA2D_ISR_TCIF)!=0){
    cIP_DMA2D_DMA2D(ip_dma2d)->IFCR=DMA2D_IFCR_CTCIF;
    H_TS_BinarySemaphoreGive_ISR(ip_dma2d->Sem_OperationDone);
  }
  
}



